package config

import (
	"context"

	"github.com/glennliao/apijson-go/consts"
	"github.com/glennliao/apijson-go/model"
	"github.com/samber/lo"
)

type H行键生成请求 struct {
	F访问名称 string
	B表名   string

	S生成参数 model.FuncParam

	S数据 model.Map
}

type H行键生成处理函数 func(ctx context.Context, 请求 *H行键生成请求, 结果 *H行键生成结果) error

type RowKeyGenerator struct {
	M名称   string
	C参数列表 []C参数项
	C处理函数 H行键生成处理函数
}

type H行键生成结果 struct {
	S数据 model.Map
}

func X新建行键生成结果() *H行键生成结果 {
	return &H行键生成结果{S数据: map[string]any{}}
}

func (结果 *H行键生成结果) S设置行键(id any) {
	结果.S数据[consts.H行键] = id
}

func (结果 *H行键生成结果) S设置多行键(数据 model.Map) {
	for 键, 值 := range 数据 {
		结果.S数据[键] = 值
	}
}

// func (配置 *配置) 生成行键(ctx context.Context, 生成函数名 string, 访问名称 string, 数据 model.Map) (model.Map, error) {
// 	if 函数, 存在 := 配置.行键生成函数映射[生成函数名]; 存在 {
// 		请求 := &行键生成请求{
// 			访问名称: 访问名称,
// 			数据:    数据,
// 		}
// 		结果 := 新建行键生成结果()
// 		错误 := 函数.处理函数(ctx, 请求, 结果)
// 		return 结果.数据, 错误
// 	}
//
// 	return nil, nil
// }

func (配置 *P配置结构) Z注册行键生成函数(函数 RowKeyGenerator) {
	配置.Z主键生成函数映射[函数.M名称] = 函数
}

func (配置 *P配置结构) H获取行键生成函数列表() []string {
	return lo.Keys(配置.Z主键生成函数映射)
}
